package com.pw.study.parse;


import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: linux_future
 * 1     读docx文件
 * <p>
 * 1.1     通过XWPFWordExtractor读
 * 1.2     通过XWPFDocument读
 * 2     写docx文件
 * 2.1     直接通过XWPFDocument生成
 * 2.2     以docx文件作为模板
 * <p>
 * POI在读写word docx文件时是通过xwpf模块来进行的，其核心是XWPFDocument。一个XWPFDocument代表一个docx文档，其可以用来读docx文档，
 * 也可以用来写docx文档。XWPFDocument中主要包含下面这几种对象：
 * l  XWPFParagraph：代表一个段落。
 * l  XWPFRun：代表具有相同属性的一段文本。
 * l  XWPFTable：代表一个表格。
 * l  XWPFTableRow：表格的一行。
 * l  XWPFTableCell：表格对应的一个单元格。
 * @since: 2022/3/24
 **/
public class WordParse {

    public static void main(String[] args) throws Exception {
        String fileName = "E:\\code\\git_code\\learnCode\\data\\doc\\14.尚硅谷大数据技术之ElasticSearch.doc";
        String file2= "E:\\code\\git_code\\learnCode\\data\\doc\\16.尚硅谷大数据项目之docker.docx";
        String a="E:\\code\\git_code\\learnCode\\data\\file\\LoginLog.csv";
        //test1(fileName);
        //test2(fileName);
        //readDoc(fileName);
        readDocx(file2);
        readeHead(a);

    }
    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
    private static void readeHead(String file2) throws Exception {
        FileInputStream is = new FileInputStream(file2);
        byte[] b = new byte[4];
        is.read(b, 0, b.length);
        String xxx = bytesToHexString(b);
        xxx = xxx.toUpperCase();
        System.out.println("头文件是：" + xxx);

        //String ooo = TypeDict.checkType(xxx);
        //System.out.println("后缀名是：" + ooo);

        /**
         常用文件的文件头如下：(以前六位为准)
         JPEG (jpg)，文件头：FFD8FF
         PNG (png)，文件头：89504E47
         GIF (gif)，文件头：47494638
         TIFF (tif)，文件头：49492A00
         Windows Bitmap (bmp)，文件头：424D
         CAD (dwg)，文件头：41433130
         Adobe Photoshop (psd)，文件头：38425053
         Rich Text Format (rtf)，文件头：7B5C727466
         XML (xml)，文件头：3C3F786D6C
         HTML (html)，文件头：68746D6C3E
         Email [thorough only] (eml)，文件头：44656C69766572792D646174653A
         Outlook Express (dbx)，文件头：CFAD12FEC5FD746F
         Outlook (pst)，文件头：2142444E
         MS Word/Excel (xls.or.doc)，文件头：D0CF11E0
         MS Access (mdb)，文件头：5374616E64617264204A
         WordPerfect (wpd)，文件头：FF575043
         Postscript (eps.or.ps)，文件头：252150532D41646F6265
         Adobe Acrobat (pdf)，文件头：255044462D312E
         Quicken (qdf)，文件头：AC9EBD8F
         Windows Password (pwl)，文件头：E3828596
         ZIP Archive (zip)，文件头：504B0304
         RAR Archive (rar)，文件头：52617221
         Wave (wav)，文件头：57415645
         AVI (avi)，文件头：41564920
         Real Audio (ram)，文件头：2E7261FD
         Real Media (rm)，文件头：2E524D46
         MPEG (mpg)，文件头：000001BA
         MPEG (mpg)，文件头：000001B3
         Quicktime (mov)，文件头：6D6F6F76
         Windows Media (asf)，文件头：3026B2758E66CF11
         MID
         */
    }

    private static void readDocx(String file2) throws Exception {
        FileInputStream is = new FileInputStream(file2);

        XWPFDocument doc = new XWPFDocument(is);

        XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
        System.out.println(extractor.getText());
        System.out.println("doc: "+doc.getTables().get(0).getText());
        is.close();
    }

    private static void readDoc(String fileName) throws Exception {
        InputStream is = new FileInputStream(fileName);
        HWPFDocument doc = new HWPFDocument(is);
    }

    private static void test2(String fileName) throws Exception {
        InputStream is = new FileInputStream(fileName);
        HWPFDocument doc = new HWPFDocument(is);
        System.out.println(doc.getCommentsRange());
    }

    private static void test1(String fileName) throws Exception {
        //The document is really a OOXML file 只读。doc文件
        InputStream is = new FileInputStream(fileName);
        WordExtractor extractor = new WordExtractor(is);
        String text = extractor.getText();
        System.out.println(text);
        String[] en = extractor.getEndnoteText();

        List<String> list = Arrays.stream(en).collect(Collectors.toList());
        System.out.println(list);

        //输出word文档所有的文本
        System.out.println(extractor.getText());
        System.out.println(extractor.getTextFromPieces());
        //输出页眉的内容
        System.out.println("页眉：" + extractor.getHeaderText());
        //输出页脚的内容
        System.out.println("页脚：" + extractor.getFooterText());
        //输出当前word文档的元数据信息，包括作者、文档的修改时间等。
        System.out.println(extractor.getMetadataTextExtractor().getText());
        //获取各个段落的文本
        String paraTexts[] = extractor.getParagraphText();
        for (int i=0; i<paraTexts.length; i++) {
            System.out.println("Paragraph " + (i+1) + " : " + paraTexts[i]);
        }
        //输出当前word的一些信息
        System.out.println(extractor.getSummaryInformation());
        is.close();
    }

}
